<?xml version="1.0" encoding="UTF-8" ?>

<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.naming.Context"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>데이터베이스 커넥션 풀 01</title>
</head>
<body>
	<h1>데이터베이스 커넥션 풀 01</h1>
	<p>자바 프로그램 실행시 비용이 많이 소모되는 부분은 객체 생성/소멸, 입출력 처리 작업임</p>
	<p>JDBC 프로그램에는 DB관련 작업시 연결객체를 생성하고, 
			소멸하는 작업이 빈번하게 일어나는데,<br/> 
			접속자 수가 많으면 실행시간이 많-이 지연됨</p>
	<p>따라서, 연결객체를 만들고 사용한 후, 바로 객체를 소멸시키지 말고
		이 객체를 저장하는 저장소 pool에 일시적으로 보관했다가,<br/>
		다른 사용자가 사용해야 하는 경우 객체를 다시 생성하지 말고, 
		기존에 생성해둔 객체를 재사용하게 함</p>
	<p>일정시간동안 더 이상 사용하는 사람이 없으면 그때서야 객체를 소멸시킴</p>
	
	<h3>설치종류</h3>
	<p>1) aphache 프로젝트의 DBCP 라이브러리 이용<br/>
		commons-dbcp-xxx.jar,commons-pool-xxx.jar<br/>
		성능은 좋지만, 설치가 번거로움</p>
	<p>2) JSP/Servlet 컨테이너에 내장된 DBCP 이용<br/>
		다양한 설치방법 제공, 성능은 무난(추천!)</p>
		
	<h3>설치방법</h3>
	<p>1) conf/server.xml에 context 태그 속 resource 태그로 작성<br/>
		땡땡24와 같은 웹 호스팅 업체를 이용하는 경우, 이 방식을 사용해서 커넥션 풀을 써야 함</p>
	<p>2) 프로젝트마다 META-INF/context.xml의 context 태그 속 resource 태그로 작성</p>
					 
	<p></p>
	
	<h3>datasource / JNDI</h3>
	<p>커넥션 풀을 사용하려면 DB 접속 정보를 설정해야 하는데 이것을 datasource라 하고, 
		이것을 JNDI 표기법을 이용해서 정의함</p>
	<p>JNDI - java naming and directory interface는 자바로 작성한 프로그램에서 네트워크를 통해
		모든 자원의 위치를 파악하고 필요시 그것을 쉽게 호출하기 위해 사용하는 규칙</p>		
	<p>JNDI는 J2EE 표준이고, DBCP는 이것을 이용하여 처리하도록 가이드라인이 정해져 있음</p>
	<p>JSP/Servlet 컨테이너마다 규칙이 조금씩 다름</p>
	<p>tomcat에서는 java://comp/env로 jndi 초기화</p>
	<p>context.xml에 정의한 jdbc/oracle11xe로 정의한 datasource를 이용해서 dbcp초기화 함</p>
	
	<%
		String sql=" select * from member where userid=? ";
		Connection conn=null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String result = "";
		
		try{
			
			// DBCP를 이용해서 Connection 객체 생성
			// datasource로 정의한 접속정보를 JNDI로 호출함
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup("java:/comp/env");
			//JNDI 초기화 구문
			DataSource ds = (DataSource)envCtx.lookup("jdbc/oracle11xe");
			//datasource 객체 참조
			conn = ds.getConnection();//연결객체 생성
			
			ps=conn.prepareStatement(sql);
				ps.setString(1, "bb");
			rs=ps.executeQuery();
			if(rs.next()){
				result+=rs.getString(1)+"/";
				result+=rs.getString(2)+"/";
				result+=rs.getString(3)+"/";
				result+=rs.getString(4)+"/";
				result+=rs.getString(5)+"/";
				result+=rs.getString(6)+"/";
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			if(rs!=null) try{rs.close();} catch(Exception e){}
			if(ps!=null) try{ps.close();} catch(Exception e){}
			if(conn!=null) try{conn.close();} catch(Exception e){}
		}		
		
		out.println(result);
	%>
	
	
</body>
</html>
















